package com.woniu.config;


import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.time.LocalDateTime;


/**
 * @Author: 马宇航
 * @Todo: 自定义的服务类，用于处理用户输入并返回响应
 * @DateTime: 25/05/06/星期二 15:56
 * @Component: 成都蜗牛学苑
 **/
@Service
public class ChatService {
        private final ChatClient chatClient;





    public ChatService(ChatClient.Builder chatClientBuilder,
                       ToolCallbackProvider tools,
                       //BookingTolls bookingTolls,
                       ChatMemory chatMemory) {

        this.chatClient = chatClientBuilder
                .defaultSystem(PROMPT_TEMPLATE)
                .defaultToolCallbacks(tools)
                .defaultAdvisors(
                        PromptChatMemoryAdvisor.builder(chatMemory).build()
                )
                .build();
    }

    public Flux<String> processQuery(String userInput) {
        System.out.println("用户输入：" + userInput);
        return chatClient.prompt(userInput)
                //.user(userInput)
                .system(p ->p.param("time", LocalDateTime.now().toString()))
                .advisors()
                .stream()
                .content();
    }


    // 定义标准的提示文本模板
    private static final String PROMPT_TEMPLATE = """
            <角色设定>
            你是蜗牛智能机器人，通过微信蜗牛小程序为用户提供精准、高效的服务。你具备以下能力：
            - 查看用户订单信息；
            - 提供课程信息；
            - 能直接调用tool工具，获取所需的全部数据。
            </角色设定>
                      
            <任务说明>
            1. 当用户需要查看课程信息时，直接调用tool工具，获取并返回所有相关课程信息，无需追问细节。
            2. 当用户需要查看订单信息时，须通过用户姓名调用tool工具，并根据用户需求（如“待支付订单”或“已完成订单”），从查询结果中筛选全部对应订单信息，整理后返回。
            3. 每次调用tool工具时，必须将工具返回的所有字段信息完整、无遗漏地整理并反馈给用户。严禁只返回部分信息或做主观筛选。
            4. 输出内容需结构清晰、美观简洁，仅呈现关键信息，避免冗余和重复。
            5. 若tool工具未查到相关数据，须明确告知用户“未查询到相关信息”。
            6. 现在的时间为{time}。
                      
            <输出格式要求>
            - 信息需分区展示，分别标明“课程信息”或“订单信息”；
            - 课程或订单的每一项数据均需列出所有字段，可用表格或清单方式分组展示；
            - 保持语句简明，逻辑清晰，排版美观整洁；
            - 严格检查输出内容，确保tool工具返回的所有字段均已完整包含，无任何遗漏。
                      
            <质量与反馈>
            - 输出前请自检，确认所有信息齐全且结构合理。
            - 如用户反馈有信息缺失，应重新调用tool工具并补充完整，向用户说明已补全。
            """;


/**
 *
 *             【操作流程】
 *             1. **新增用户前**，请依次提供以下信息：
 *                - 姓名
 *                - 密码
 *                - 角色(老师/学生)
 *                - 余额（可选）
 *                - 手机号（可选）
 *                - 积分（可选）
 *                - 头像（可选）
 *                - 创建人（可选）
 *                - 创建时间 （可选）
 *                - 修改人（可选）
 *                - 修改时间（可选）
 *
 *             2. **增/删/改操作**时，系统会发送确认提示，需用户回复“确认”后才会执行操作。
 *
 *             【功能指引】
 *             - 功能讲解
 *             - 问题解答
 *             - 操作引导（查找、购买、删除等）
 *
 *             【注意事项】
 *             - 使用MCP工具需提供相关信息（如用户ID等）。
 *             - 回复仅包含主要内容，避免无关信息干扰。
 *
 *             ——
 *
 *             **示例输出格式：**
 *
 *             【新增用户流程】 s
 *             请依次提供：姓名、密码、手机号、权限。 s
 *             收到全部信息后，将发送确认提示，再进行添加操作。
 *
 *             【操作确认】 s
 *             您确定要【删除/修改/增加】（查询操作不用确认）该用户吗？ s
 *             请回复“确认”继续，或“取消”终止操作。
 *
 */
//    @GetMapping("/ai/generate")
//    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
//        return Map.of("generation", this.chatClient.call(message));
//    }
//
//    @GetMapping("/ai/generateStream")
//    public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
//        var prompt = new Prompt(new UserMessage(message));
//        return chatClient.stream(prompt).stream();
//    }



}
